package com.nacos.concifg;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Properties;
import java.util.concurrent.Executor;

@Component
public class DataBaseConfig {

    private DataBase dataBase;

    private final ObjectMapper objectMapper = new ObjectMapper(); // 可以考虑配置为Bean并注入

    @PostConstruct
    public void init() throws Exception {
        String serverAddr = "localhost:8848"; // Nacos 服务器地址
        String dataId = "configServiceJson-dev.properties"; // 配置文件的dataId
        String group = "DEFAULT_GROUP"; // 配置文件的group

        Properties properties = new Properties();
        properties.put("serverAddr", serverAddr);
        properties.put("namespace", "229bd3af-0083-495a-a44c-774b2e45c7f1");

        ConfigService configService = NacosFactory.createConfigService(properties);

        String content = configService.getConfig(dataId, group, 5000);
        System.out.println("Initial config: " + content);
        dataBase = objectMapper.readValue(content, DataBase.class);

        configService.addListener(dataId, group, new Listener() {
            @Override
            public void receiveConfigInfo(String configInfo) {
                try {
                    // 在这里处理配置变化，比如解析JSON字符串并更新你的应用状态
                    // 注意：这里的处理逻辑应该是线程安全的，因为Nacos可能会在不同的线程中调用这个方法
                    System.out.println("Config changed: " + configInfo);
                    dataBase = objectMapper.readValue(configInfo, DataBase.class);
                } catch (JsonProcessingException e) {
                    throw new RuntimeException(e);
                }
            }

            @Override
            public Executor getExecutor() {
                // 如果你需要自定义线程池来处理配置变化，可以在这里返回它
                // 否则，使用默认的线程池即可
                return null;
            }
        });


        //dataBase = objectMapper.readValue(YamlToJsonUtil.toJson(), DataBase.class);
        // 现在dataBase对象包含了从Nacos配置中心解析的配置数据
        // 你可以在这里做进一步的处理，比如将dataBase注册为Bean等
    }

    // Getter方法，用于访问解析后的DataBase对象（如果需要的话）
    public DataBase getDataBase() {
        return dataBase;
    }
}